﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Compilex.Syntatic;

namespace Compilex.CodeGeneration
{
    public class CarreguexIntex
    {
        protected CodeGenerator Generator { get; set; }
        public CarreguexIntex(CodeGenerator generator)
        {
            this.Generator = generator;
        }
        private static bool loaded = false;

        public string Invoke()
        {
            if (!loaded)
            {
                // seria ambiente de execução, mas o linker não existe
                Generator.TailDataBuilder.AppendLine(@"
carreguex_intex 		LD _C_0
						MM _R_LEITURA			
loop_carreguex_intex 	GD /000 ; ler do teclado e coloca no acc
						MM _LEITURA
						; 1º digito
						/ _C_256
						- _C_48 ; colocou o 1o digito no acc
						MM _T_LEITURA ; guarda em _T_LEITURA
						+ _C_35  ; testa contra 0d
						JZ saida_carreguex
						LD _R_LEITURA ; carrega o resultado parcial
						* _C_10 
						+ _T_LEITURA ;
						MM _R_LEITURA ; leitura = resultado*10 + digito
						; 2ºdigito
						LD _LEITURA
						* _C_256
						/ _C_256
						- _C_48 ; colocou o 2o digito no acc
						MM _T_LEITURA
						+ _C_35 ; testa contra 0d
						JZ saida_carreguex
    					LD _R_LEITURA ; carrega o resultado parcial
						* _C_10 
						+ _T_LEITURA ;
						MM _R_LEITURA ; leitura = resultado*10 + digito
						JP loop_carreguex_intex
saida_carreguex			LD _C_0 ;

_LEITURA K /0
_T_LEITURA K /0
_R_LEITURA K /0
                    ");

                Generator.Labels.GetConstantLabel(0);
                Generator.Labels.GetConstantLabel(1);
                Generator.Labels.GetConstantLabel(10);
                Generator.Labels.GetConstantLabel(35);
                Generator.Labels.GetConstantLabel(48);
                Generator.Labels.GetConstantLabel(100);
                Generator.Labels.GetConstantLabel(256);
            }


            string executionLabel = Generator.Labels.GetAssignLabel();
            Generator.Ops.LoadAddress(executionLabel);
            Generator.CodeBuilder.AppendLine("MM saida_carreguex");
            Generator.Ops.JumpTo("carreguex_intex");
            string resultLabel = Generator.Labels.IncrementResultsLabel();
            Generator.CodeBuilder.AppendLine(executionLabel + " LD _R_LEITURA");
            Generator.CodeBuilder.AppendLine("MM " + resultLabel);
            loaded = true;
            return resultLabel;
        }

        


    }
}
